/*
 * Copyright 2017 Baiyyy
 * @(#)SuplReportIstrHdl.java
 */

package com.byyy.ccts.modules.cc.handle.istr.v12;

import com.byyy.ccts.modules.cc.Global;
import com.byyy.ccts.core.utils.DateUtils;
import com.byyy.ccts.core.utils.HexUtils;
import com.byyy.ccts.core.utils.InstructionUtils;
import com.byyy.ccts.modules.cc.entity.ccts.TSHumiture;
import com.byyy.ccts.modules.cc.entity.istr.InstructionMdl;
import com.byyy.ccts.modules.cc.entity.istr.SuplData;
import com.byyy.ccts.modules.cc.entity.istr.v12.SuplReportMdl;
import com.byyy.ccts.modules.cc.handle.istr.IHandler;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * 178A协议V1.2 补传数据上报指令处理类
 * Created by DELL on 2018-4-27.
 */
@Service("suplReportIstrHdl")
public class SuplReportIstrHdl extends IHandler {

    /**
     * 补传数据上报指令处理
     * 1.校验(已提出共通)
     * 2.解析登录指令
     * 3.将数据插入数据库
     * 4.应答(已提出共通)
     * @param instructions
     * @return
     */
    @Override
    public byte[] handle(byte[] instructions) {
        logger.debug("补传数据V1.2 开始执行");
        // 解析登录指令
        InstructionMdl istrMdl = this.generateInstructionModel(instructions);
        SuplReportMdl suplReportMdl = new SuplReportMdl();
        suplReportMdl.setDeviceId(istrMdl.getDeviceId());
        suplReportMdl.setSequenceNum(istrMdl.getSequenceNum());

        // 补传数据条数（N）
        int count = instructions[15];
        suplReportMdl.setDeviceType(instructions[16]);
        List<SuplData> suplDatas = new ArrayList(count);
        SuplData tempSuplData = null;

        // 循环遍历生成补传数据
        for (int i = 0; i < count; i++) {
            tempSuplData = new SuplData();
            // GSM时间 ---年
            tempSuplData.setGsmYear(instructions[17 + (i * 20)]);
            // GSM时间 ---月
            tempSuplData.setGsmMonth(instructions[18 + (i * 20)]);
            // GSM时间 ---日
            tempSuplData.setGsmDay(instructions[19 + (i * 20)]);
            // GSM时间 ---时
            tempSuplData.setGsmHour(instructions[20 + (i * 20)]);
            // GSM时间 ---分
            tempSuplData.setGsmMinute(instructions[21 + (i * 20)]);
            // GSM时间 ---秒
            tempSuplData.setGsmSecond(instructions[22 + (i * 20)]);
            // 信号量
            tempSuplData.setSemaphore(instructions[23 + (i * 20)]);
            // 电池电量
            tempSuplData.setElectric(instructions[24 + (i * 20)]);
            // 内部温度符号
            tempSuplData.setTempSymbol(instructions[25 + (i * 20)]);
            // 内部温度值整数
            tempSuplData.setTempeInt(instructions[26 + (i * 20)]);
            // 内部温度值小数
            tempSuplData.setTempDec(instructions[27 + (i * 20)]);
            // 环境温度符号
            tempSuplData.setEnvTempSymbol(instructions[28 + (i * 20)]);
            // 环境温度值整数
            tempSuplData.setEnvTempeInt(instructions[29 + (i * 20)]);
            // 环境温度值小数
            tempSuplData.setEnvTempeDec(instructions[30 + (i * 20)]);
            // 湿度值
            tempSuplData.setHumidity(instructions[31 + (i * 20)]);
            // 报警值高位
            tempSuplData.setWarnH(instructions[32 + (i * 20)]);
            // 报警值低位
            tempSuplData.setWarnL(instructions[33 + (i * 20)]);
            // 保留数据
            tempSuplData.setKeepOne(instructions[35 + (i * 20)]);
            // 保留数据
            tempSuplData.setKeepTwo(instructions[36 + (i * 20)]);
            suplDatas.add(tempSuplData);
        }
        suplReportMdl.setSuplDatas(suplDatas);

        this.insert(suplReportMdl);

        logger.debug("补传数据V1.2 执行结束");
        // 生成应答信息，返回
        return InstructionUtils.generateCommResponse(suplReportMdl, Global.ISTR_SUPPLEMENT_REPORT);
    }


    /**
     *  将实时数据插入数据库中
     */
    private void insert(SuplReportMdl model) {
        TSHumiture tsHumiture = null;
        List<TSHumiture> tsHumitures = new ArrayList<>();
        float temperature = 0;
        for (SuplData temp : model.getSuplDatas()) {
            tsHumiture = new TSHumiture();
            tsHumiture.setDeviceSn(HexUtils.bytesToHexFun3(model.getDeviceId()));
            tsHumiture.setCollectTime(new Timestamp(DateUtils.structure(
                    temp.getGsmYear(), temp.getGsmMonth() - 1,
                    temp.getGsmDay(), temp.getGsmHour(),
                    temp.getGsmMinute(), temp.getGsmSecond()).getTime()));

            // 设置温度值,注意零下的情况
            temperature = Float.valueOf((int) temp.getTempeInt() + "." + (int) temp.getTempDec());
            if (!(Global.OTH_TEMP_SYMBOL_PLUS == temp.getTempSymbol())) {
                temperature = -temperature;
            }
            tsHumiture.setTemperature(temperature);
            tsHumiture.setSemaphore(temp.getSemaphore());
            tsHumiture.setElectric(temp.getElectric());
            tsHumiture.setHumidity(temp.getHumidity());
            tsHumitures.add(tsHumiture);
        }

        // 去重
        List<TSHumiture> noRepeatData = this.clearRepeatData(tsHumiture.getDeviceSn(), tsHumitures);
        if (noRepeatData == null || noRepeatData.size() < 1) {
            return;
        }

        this.insertHumiture(noRepeatData);
    }

}
